package bcrypt

import (
	"golang.org/x/crypto/bcrypt"
)

// bcrypt 每次加密的结果都不一样，因为加密过程中会自动生成一个随机的salt值，这个salt值和密码一起参与哈希计算，所以每次得到的值不一样
/*
bcrypt.GenerateFromPassword 生成的密码hash是可逆的吗
不可逆。bcrypt.GenerateFromPassword 生成的密码 hash 是单向哈希，设计上就是不可逆的。

为什么不可逆？
1. 哈希函数的本质
bcrypt 是基于 Blowfish 密码的加密哈希函数，具有以下特性：

单向性：只能从明文生成哈希，不能从哈希还原明文
抗碰撞性：很难找到两个不同的输入产生相同的输出
雪崩效应：输入的微小变化会导致输出的巨大变化
*/
func HashPassWord(password string) (string, error) {
	hashedBytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	if err != nil {
		return "", err
	}

	return string(hashedBytes), nil
}

func CheckPassword(password, hashedPassword string) bool {
	return bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password)) == nil
}
